#ifndef STREAM_SERVICE_H_
#define STREAM_SERVICE_H_

#include <thread>
#include <list>
#include <mutex>

struct event_base;
struct evconnlistener;
struct bufferevent;
class StreamHandle;

/// @brief 文件流传输服务
/// 文件传输服务类，所有文件传输的处理与监听都在同一个线程中处理
class StreamService
{
public:
    /// @brief 构造函数
    /// @param port 监听端口
    /// @param heartbeat 心跳间隔，向主服务保持心跳的间隔
    StreamService(int port, int heartbeat = 30);
    virtual ~StreamService();
    /// @brief 初始化
    bool Init();
    /// @brief 向主服务发起连接
    /// @param ip 主服务地址
    /// @param port 主服务端口
    bool Connect(const char *ip, int port);
    /// @brief 消息读取回调，读取来自主服务发送的消息
    void ReadCb();
    /// @brief 消息发送回调，当向主服务发送完报文后被回调
    void WriteCb();
    /// @brief 事件回调，监听与主服务的连接事件
    void EventCb(short which);
    /// @brief 启动
    void Start();
    /// @brief 停止
    void Stop();
    /// @brief 分发任务
    void Dispatch();
    /// @brief 新连接回调
    /// @param socket 对端socket
    void ConnListener(int socket);

    bool SendToCenter(const char *header, int header_size, const char *data, int data_size);

    std::thread* GetThread() const;

private:
    /// @brief 与主服务的心跳保持
    void SendHeartBeat();
    int port_;
    int heartbeat_;
    event_base *ev_base_ = nullptr;
    evconnlistener *ev_listener_ = nullptr;
    bufferevent *buf_ev_ = nullptr;
    std::thread *run_thread_ = nullptr;
    bool quit_flag_;
    std::mutex mtx_;
};
#endif
